#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=2e5+6;
int n,m,k;
vector<int>vec[Maxn],e[Maxn];
vector<int>fm[Maxn];
int tot,ep[Maxn],fa[Maxn];
int col[Maxn],cnt;
bool vis[Maxn],isok[Maxn],bok[Maxn];
int id[Maxn];
vector<int>sol[Maxn];
vector<int>pro[Maxn];

void dfs(int u,int ft){
	col[u]=cnt; fa[u]=ft;
	if(ft) e[ft].emplace_back(u),ep[u]=++tot;
	if(isok[u]) fm[cnt].emplace_back(u);
	for(auto v:vec[u]){
		if(col[v]) continue;
		dfs(v,u);
	}
}
void dfs_(int u){
	vis[u]=1;
	for(auto v:e[u]){
		dfs_(v);
		bok[ep[u]]^=bok[ep[v]];
	}
}

int main(){
	freopen("travel.in","r",stdin);
	freopen("travel.out","w",stdout);

	scanf("%d%d%d",&n,&m,&k);
	
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		vec[u].emplace_back(v);
		vec[v].emplace_back(u);
	}
	for(int i=1;i<=k;i++){
		scanf("%d",&id[i]); 
		isok[id[i]]=1;
	}
	
	for(int i=1;i<=n;i++){
		if(!col[i]) ++cnt,dfs(i,0);
	}
	

	for(int i=1;i<=cnt;i++){
		int s=fm[i].size();
		if(s&1) isok[fm[i].back()]=0,fm[i].pop_back();
	}
	for(int i=1;i<=n;i++){
		if(isok[i]) bok[ep[i]]^=1;
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]) dfs_(i);
	}	

	int ans=0;
	for(int i=1;i<=n;i++){
		if(isok[i]){
			int u=i;
			vector<int>ps;
			while(bok[ep[u]]){
				ps.emplace_back(u);
				bok[ep[u]]=0;
				u=fa[u];
			}
			if(pro[u].size()){
				reverse(pro[u].begin(),pro[u].end());
				for(auto v:pro[u]) ps.emplace_back(v);
				++ans; sol[ans]=ps;
				pro[u].resize(0);
			}
			else{
				ps.emplace_back(u);
				pro[u]=ps;	
			}
		}
	}
	
	printf("%d\n",ans);
	for(int i=1;i<=ans;i++){
		printf("%d ",sol[i].size());
		for(auto j:sol[i]) printf("%d ",j); 
		puts("");
	}

	return 0;
}
/*
5 4 4
1 2
2 3
4 2
5 2
1 3 4 5

8 7 4
1 2
2 3
3 4
2 5
5 6
3 7
7 8
1 4 6 8

10 8 5
2 1
5 7
1 4
10 4
6 1
10 1
7 6
3 4
7 9 5 2 6

10 9 5
9 1
8 10
10 3
2 3
3 7
8 3
4 9
5 9
7 10
1 3 7 4 2


*/
